package com.xuecheng.content.controller;

import com.xuecheng.api.content.FileManagerApi;

import com.xuecheng.api.content.model.file.UploadTokenResult;
import com.xuecheng.common.domain.code.CommonErrorCode;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.content.common.constant.ContentErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * <p></p>
 *
 * @Description:
 */
@Slf4j
@RestController
public class FileManagerController implements FileManagerApi {

    @Autowired
    private RestTemplate restTemplate;

    //#文件系统微服的请求地址
    // file.service.url=http://127.0.0.1:56082/farming/generatetoken?origin=qiniu
    // #文件存储空间名称
    // file.service.bucket= xc140-static-imgs
    //
    //
    // #文件存储区域的地址
    // file.service.upload.region = http://upload.qiniu.com
    // #文件访问的cdn加速域名
    // cdn.domain = r9hurnt4x.hd-bkt.clouddn.com
    // file.token.type = 1
    // file.token.deadline = 3600
    @Value("${file.service.url}")
    private String url;
    @Value("${file.service.bucket}")
    private String bucket;
    @Value("${file.service.upload.region}")
    private String region;
    @Value("${cdn.domain}")
    private String domain;
    @Value("${file.token.type}")
    private String tokenType;
    @Value("${file.token.deadline}")
    private int deadline;



    @GetMapping("common/qnUploadToken")
    public UploadTokenResult qiniuUploadToken() {

        // 1.发送请求获得上传令牌
        HashMap<String, Object> requestBody = new HashMap<>();
        //{
        //   "tokenType":"1",
        //   "scope":"xc140-static-imgs",
        //   "deadline":3600,
        //   "key":"111xxxeeee"
        // }
        requestBody.put("tokenType",tokenType);
        requestBody.put("scope",bucket);
        requestBody.put("deadline",deadline);

        // 由于qiniu的文件key是确保文件的唯一，需要生成一个唯一标识
        String fileKey = UUID.randomUUID().toString() + RandomStringUtils.randomAlphanumeric(16);
        requestBody.put("key",fileKey);


        /*
         * 参数：
         *   1.访问路径地址
         *   2.请求体数据（json数据）
         *   3.返回responsebody要封装的类型
         *   4.querystring参数（选填）
         * */
        ResponseEntity<Map> response = restTemplate.postForEntity(url, requestBody, Map.class);



        // 2.解析响应结果，封装数据并返回给前端
        // 判断获得的结果数据：
        //  1.响应状态（200）  2.响应result（code=0--成功）
        HttpStatus statusCode = response.getStatusCode();
        if (!(HttpStatus.OK == statusCode)) {
            ExceptionCast.cast(ContentErrorCode.E_120025);
        }

        Map body = response.getBody();

        Object o = body.get("code");
        int code = CommonErrorCode.SUCCESS.getCode();

        if (!(code == (int)o)) {
            ExceptionCast.cast(ContentErrorCode.E_120026);
        }

        UploadTokenResult tokenResult = new UploadTokenResult();
        tokenResult.setQnToken(body.get("result").toString());
        tokenResult.setDeadline(deadline);
        tokenResult.setDomain(domain);
        tokenResult.setTokenType(tokenType);
        tokenResult.setKey(fileKey);
        tokenResult.setScope(bucket);
        tokenResult.setUp_region(region);

        return tokenResult;
    }


}